package com.example.zmade;

import static com.example.zmade.Func.getCRC1;

public class SendData extends MainActivity{
        // 通信协议包结构: 包头(1) + 版本(1) + 命令码(1) + 数据长度(1) + 数据(N) + 校验(2) = 6 + N
        static final byte CMMNCT_HEADER=(byte)0xFA;  // 通信数据头
        static final byte CMMNCT_VERSION=(byte)0x80; //版本
        //------------------------------------- 通信协议字段长度分配 -------------------------------------//
        static final int CMMNCT_FRAME_HEADER_LENGTH=4;// 通信结构数据头长度
        static final int CMMNCT_DATA_MAX_LENGTH=256;//通信数据最大长度
        static final int CMMNCT_CHECK_LENGTH=2;//通信校验长度
        static final int CMMNCT_FRAME_MAX_LENGTH=(CMMNCT_FRAME_HEADER_LENGTH + CMMNCT_DATA_MAX_LENGTH + CMMNCT_CHECK_LENGTH);//通信结构最大长度

        static byte[] gCmmnctSendDataBuf=new byte[CMMNCT_FRAME_MAX_LENGTH];

        public static byte[] CommSendCmd(byte _dictate, int  _data_len, byte[] _databuf) {
            int i;
            gCmmnctSendDataBuf[0] = CMMNCT_HEADER;//包头
            gCmmnctSendDataBuf[1] = CMMNCT_VERSION;//版本
            gCmmnctSendDataBuf[2] =  _dictate; //指令码
            gCmmnctSendDataBuf[3] = (byte)_data_len;   //数据长度
            //包数据
            if(_data_len>0){
                for(i=0;i<_data_len;i++)
                {
                    gCmmnctSendDataBuf[CMMNCT_FRAME_HEADER_LENGTH+i] =  _databuf[i];
                }
            }
            //CRC校验
            i= getCRC1(gCmmnctSendDataBuf,CMMNCT_FRAME_HEADER_LENGTH + _data_len);  //对以上所有数据进行CRC16校验
            gCmmnctSendDataBuf[CMMNCT_FRAME_HEADER_LENGTH+_data_len] = (byte) ((i>>8)&0xFF); //填充CRC16校验值
            gCmmnctSendDataBuf[CMMNCT_FRAME_HEADER_LENGTH+_data_len+1] = (byte) (i&0xFF); //填充CRC16校验值

            //发送数据
            //com.sendData(gCmmnctSendDataBuf,CMMNCT_FRAME_HEADER_LENGTH+_data_len+2);
            return subBytes(gCmmnctSendDataBuf,0,CMMNCT_FRAME_HEADER_LENGTH+_data_len+2);
        }

        public static boolean check_recvData(byte[] data,int len){
            if(len>=7){
                int   dataLength=data[3];
                if(len==(6+dataLength)){
                    byte[] byt=new byte[2];
                    int CRC16=getCRC1(data,4 + dataLength);  //对以上所有数据进行CRC16校验
                    byt[0]=(byte) ((CRC16>>8)&0xFF);
                    byt[1]=(byte) (byte) (CRC16 &0xFF);
                    if((byt[0]==data[len-2])&&(byt[1]==data[len-1])){
                        return true;
                    }
                }
            }
            return false;
        }
    public  static byte[] subBytes(byte[] src, int begin, int count) {
        byte[] bs = new byte[count];
        System.arraycopy(src, begin, bs, 0, count);
        return bs;
    }

}
